/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package polar.experimento1.servicios;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.ejb.Stateless;
import polar.experimento1.entidades.Ambulancia;
import polar.experimento1.entidades.Bomberos;
import polar.experimento1.entidades.CruzRoja;
import polar.experimento1.entidades.DefensaCivil;
import polar.experimento1.entidades.Ejercito;
import polar.experimento1.entidades.Emergencia;
import polar.experimento1.entidades.IInformacion;
import polar.experimento1.entidades.IPersonal;
import polar.experimento1.entidades.Localidad;
import polar.experimento1.entidades.Plano;
import polar.experimento1.entidades.Policia;

/**
 *
 * @author Afrp
 */
@Stateless
public class DatosBeanMock implements DatosAlcaldia
{
     private final static int CANTIDAD_MECANISMOS = 100;
    private final static int CANTIDAD_EMERGENCIAS = 10;
     private final static int CANTIDAD_LOCALIDADES = 20;
     private final static int CANTIDAD_INFORMACION = 50;

    // -----------------------------------------------
    // Atributos
    // -----------------------------------------------

     /**
     * Objeto que almacena los datos en memoria principal. [Implementación temporal]
     */
    private final static List<IInformacion> sDataInformacion;
    /**
     * Objeto que almacena los datos en memoria principal. [Implementación temporal]
     */
    private final static List<IPersonal> sDataMecanismos;
    /**
     * Objeto que almacena los datos en memoria principal. [Implementación temporal]
     */
    private final static List<Emergencia> sDataEmergencia;

       /**
     * Objeto que almacena los datos en memoria principal. [Implementación temporal]
     */
    private final static List<Localidad> localidades;

    // -----------------------------------------------
    // Constructor
    // -----------------------------------------------
    /**
     * Constructor de la clase. Inicializa los atributos.
     */


    static {
        localidades=new ArrayList<Localidad>();
        sDataMecanismos = new ArrayList<IPersonal>();
         sDataInformacion=new ArrayList<IInformacion>();
         sDataEmergencia = new ArrayList<Emergencia>();
          for (int ind = 0; ind < CANTIDAD_LOCALIDADES; ind++)
        {
        sDataMecanismos.clear();
        Localidad loc=new Localidad();
        loc.setCoordenadaX(ind);
        loc.setCoordenadaY(ind);
        loc.setNombre("LOCALIDAD"+ind);
        
       for (int i = 0; i < CANTIDAD_MECANISMOS; i++)
        {
            int temporal=0;
            if(temporal==0)
            {
                Ejercito in= new Ejercito();
                in.setCoordenadaX(i);
                in.setCoordenadaY(i);
                if(i%2==0)
                {
                in.setDisponibilidad(true);
                }
                  if(i%2==1)
                {
                in.setDisponibilidad(false);
                }
                in.setNumeroEfectivos(i);
                if(i+1%2==0)
                {
                in.setTipo("Caballeria");
                }
                 if(i+1%2==1)
                {
                in.setTipo("Infanteria");
                }
                sDataMecanismos.add(in);

            }
               if(temporal==1)
            {
                Policia in= new Policia();
                in.setCoordenadaX(i);
                in.setCoordenadaY(i);
                if(i%2==0)
                {
                in.setDisponibilidad(true);
                }
                  if(i%2==1)
                {
                in.setDisponibilidad(false);
                }
                in.setNumeroEfectivos(i);
                if(i+1%2==0)
                {
                in.setTipo("Transito");
                }
                 if(i+1%2==1)
                {
                in.setTipo("Metropolitana");
                }
                sDataMecanismos.add(in);

            }
               if(temporal==2)
            {
                Bomberos in= new Bomberos();
                in.setCoordenadaX(i);
                in.setCoordenadaY(i);
                if(i%2==0)
                {
                in.setDisponibilidad(true);
                }
                  if(i%2==1)
                {
                in.setDisponibilidad(false);
                }
                in.setNumeroEfectivos(i);
                in.setId("BOMB"+i);
                sDataMecanismos.add(in);

            }
              if(temporal==3)
            {
                DefensaCivil in= new DefensaCivil();
               in.setCoordenadaX(i);
                in.setCoordenadaY(i);
                if(i%2==0)
                {
                in.setDisponibilidad(true);
                }
                  if(i%2==1)
                {
                in.setDisponibilidad(false);
                }
                in.setNumeroEfectivos(i);
                if(i+1%2==0)
                {
                in.setTipoDeGrupo("Busqueda");
                }
                 if(i+1%2==1)
                {
                in.setTipoDeGrupo("Oficina");
                }
                sDataMecanismos.add(in);

            }

                  if(temporal==4)
            {
               Ambulancia in= new Ambulancia();
               in.setCoordenadaX(i);
                in.setCoordenadaY(i);
                if(i%2==0)
                {
                in.setDisponibilidad(true);
                }
                  if(i%2==1)
                {
                in.setDisponibilidad(false);
                }
                in.setInscripcionSDS(i);

                if(i+1%2==0)
                {
                in.setTipo("Atencion Basica");
                }
                 if(i+1%2==1)
                {
                in.setTipo("Vehiculo especializado");
                }
                sDataMecanismos.add(in);

            }

             if(temporal==5)
            {
               CruzRoja in= new CruzRoja();
               in.setCoordenadaX(i);
                in.setCoordenadaY(i);
                if(i%2==0)
                {
                in.setDisponibilidad(true);
                }
                  if(i%2==1)
                {
                in.setDisponibilidad(false);
                }
                in.setId("Cruz roja:"+i);

              in.setNumeroEfectivos(i);
                sDataMecanismos.add(in);

            }
            temporal++;
        }
        loc.setMecanismos((ArrayList)sDataMecanismos);


        sDataEmergencia.clear();
        for (int i = 0; i < CANTIDAD_EMERGENCIAS; i++)
        {
        Emergencia temporal=new Emergencia();
        temporal.setCoordenadaX(i);
        temporal.setCoordenadaY(i);
        Date date = new Date();
        temporal.setFechaReporte(date);
        temporal.setPrioridad(i%10);
        temporal.setTipoEmeprgencia("Tipo"+i%10);
        for(int indi=0;indi<i;indi++)
        {
            if(indi+1==i)
            {
                Date datee = new Date();
                 temporal.setFechaFinal(datee);
            }
        }
        sDataEmergencia.add(temporal);
        }
        loc.setEmergencias((ArrayList) sDataEmergencia);

         sDataInformacion.clear();
         for (int i = 0; i < CANTIDAD_INFORMACION; i++)
        {
        Plano temporal=new Plano();
        temporal.setDireccion("Direccion:"+i);
         Date datee = new Date();
        temporal.setTipoPlano("Tipo"+i%3);

        sDataInformacion.add(temporal);
        }
        loc.setInformacion((ArrayList<IInformacion>) sDataInformacion);
        localidades.add(loc);
        }
    }


    public DatosBeanMock() {
    }

    // -----------------------------------------------
    // Métodos
    // -----------------------------------------------
    /**
     * Permite crear un objeto dentro de la persistencia del sistema.
     * @param obj. Objeto que representa la instancia de la entidad que se quiere crear.
     */
    public void create(Object obj) throws Exception
    {
        if (obj instanceof Emergencia)
        {
            Emergencia in = (Emergencia) obj;
            in.setCoordenadaX(sDataEmergencia.size());
            in.setCoordenadaY(sDataEmergencia.size());
            sDataEmergencia.add(in);
        } else if (obj instanceof IPersonal) {
            IPersonal m = (IPersonal) obj;
            for (IPersonal us : sDataMecanismos) {
                if (us.getCoordenadaX()==(m.getCoordenadaX())&&us.getCoordenadaY()==(m.getCoordenadaY()))
                {
                    throw new Exception("La ubicacion '" + m.getCoordenadaX() + "' ya ha sido registrada en el sistema");
                }
              
            }
            sDataMecanismos.add(m);
        }

    }

    /**
     * Permite modificar un objeto dentro de la persistencia del sistema.
     * @param obj. Objeto que representa la instancia de la entidad que se quiere modificar.
     */
    public void update(Object obj)
    {
        if (obj instanceof IPersonal) {
            sDataMecanismos.set(sDataMecanismos.indexOf(obj), (IPersonal) obj);
        } else if (obj instanceof Emergencia) {
            sDataEmergencia.set(sDataEmergencia.indexOf(obj), (Emergencia) obj);
        }
    }

   

    /**
     * Retorna la lista de todos los elementos de una clase dada que se encuentran en el sistema.
     * @param c. Clase cuyos objetos quieren encontrarse en el sistema.
     * @return list. Listado de todos los objetos de una clase dada que se encuentran en el sistema.
     */
    public List findAll(Class c) {
        if (c.equals(Emergencia.class)) {
            return sDataEmergencia;
        } else if (c.equals(IPersonal.class)) {
            return sDataMecanismos;
        } else {
            return null;
        }
    }

    /**
     * Retorna la instancia de una entidad dado un identificador y la clase de la entidadi.
     * @param c. Clase de la instancia que se quiere buscar.
     * @param id. Identificador unico del objeto.
     * @return obj. Resultado de la consulta.
     */
    public Object findById(Object id, Class c) {

        if (c.equals(Emergencia.class)) {
            for (Object v : findAll(c)) {
                Emergencia in = (Emergencia) v;
                if (in.getCoordenadaX()==((Emergencia)id).getCoordenadaX())
                {
                    return in;
                }
            }
        } else if (c.equals(IPersonal.class)) {
            for (Object v : findAll(c)) {
                IPersonal us = (IPersonal) v;
                if (us.getCoordenadaY()==((IPersonal)id).getCoordenadaY())
                {
                    return us;
                }
            }
        }
        return null;
    }
}
